#ifndef BASE_SYSTEM_LOG_IO_INCLUDE_ASYNC_FSYNC_H
#define BASE_SYSTEM_LOG_IO_INCLUDE_ASYNC_FSYNC_H

#include <atomic>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <thread>
#include <unordered_set>
#include <vector>

namespace Base {
namespace SystemLog {

/**
 * AsyncFsync 提供异步文件同步功能，避免阻塞主线程
 * 支持单例模式，可以被多个组件共享使用
 */
class AsyncFsync {
public:
    // 单例模式
    static AsyncFsync& GetInstance();
    
    AsyncFsync();
    AsyncFsync(bool isDummy); // 添加dummy构造函数
    ~AsyncFsync();
    
    // 禁用拷贝和赋值
    AsyncFsync(const AsyncFsync&) = delete;
    AsyncFsync& operator=(const AsyncFsync&) = delete;
    
    /**
     * 添加需要异步同步的文件描述符
     * @param fd 文件描述符
     */
    void AddFile(int fd);
    
    /**
     * 移除文件描述符
     * @param fd 文件描述符
     */
    void RemoveFile(int fd);
    
    /**
     * 请求立即同步指定文件
     * @param fd 文件描述符
     */
    void RequestImmediateSync(int fd);
    
    /**
     * 请求立即同步所有文件
     */
    void RequestImmediateSyncAll();
    
    /**
     * 设置同步间隔
     * @param intervalMs 间隔时间（毫秒）
     */
    void SetSyncInterval(uint32_t intervalMs);
    
    /**
     * 停止异步同步服务
     */
    void RequestStop();
    
    /**
     * 重启异步同步服务
     */
    void Restart();
    
    /**
     * 获取当前管理的文件数量
     */
    size_t GetFileCount() const;

private:
    void WorkerThread();
    void SyncFiles(const std::vector<int>& fds);
    
    std::unordered_set<int> fds_;               // 使用unordered_set提高查找效率
    std::unordered_set<int> immediateSyncFds_;  // 需要立即同步的文件
    mutable std::mutex mutex_;
    std::condition_variable cond_;
    std::thread worker_;
    std::atomic<bool> running_{false};
    std::atomic<bool> immediateSync_{false};    // 立即同步标志
    std::chrono::milliseconds syncInterval_{10000}; // 默认10秒同步一次
};

} // namespace SystemLog
} // namespace Base

#endif // BASE_SYSTEM_LOG_IO_INCLUDE_ASYNC_FSYNC_H